﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Models;
using DAL;

namespace Metier
{
    public class GestionComptes
    {

        public void MiseAJour(Utilisateur utilisateur)
        {
            try
            {
                using (Context db = new Context())
                {
                    db.Utilisateurs.Attach(utilisateur);
                    db.Entry(utilisateur).State = System.Data.EntityState.Modified;
                    db.SaveChanges();
                }
            }
            catch (ArgumentNullException ex)
            {
                throw ex;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        public void VerouillageUtilisateur(bool verouillage, Utilisateur utilisateur)
        {
            try
            {
                utilisateur.IsApproved = verouillage;
                MiseAJour(utilisateur);
            }
            catch (ArgumentNullException ex)
            {
                throw ex;
            }
        }

        public void Ajouter(Utilisateur utilisateur, bool envoyerMailConfirmation)
        {
            try
            {
                using (Context db = new Context())
                {
                    utilisateur.DateCreation = DateTime.Now;
                    db.Utilisateurs.Add(utilisateur);
                    db.SaveChanges();
                }

                if (envoyerMailConfirmation)
                {
                    Mail mail = new Mail();

                    mail.Destinataire = utilisateur.Email;

                    mail.Titre = "Compte Crée sur YouFood WebApp";

                    StringBuilder str = new StringBuilder("Bienvenue sur la plateforme WebApp de YouFood !<br />");
                    str.Append("Vous pouvez maintemant vous authentifier sur la WebApplication YouFood. Pour cela utiliser les informations ci dessus : <br />");
                    str.Append("Email : " + utilisateur.Email + "<br />");
                    str.Append("Mot de passe : " + utilisateur.Password + "<br /><br />");
                    str.Append("Bonne journée à vous<br />");
                    str.Append("You Food WebApp");

                    mail.envoyer();
                }
            }
            catch (ArgumentNullException ex)
            {
                throw ex;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        public void ChangerMotdePasse(string email, string vieuxMotDePasse, string nouveauMotDePasse)
        {
            try
            {
                using (Context db = new Context())
                {

                    Utilisateur utilisateur = Chercher(email);

                    if (utilisateur.Password == vieuxMotDePasse)
                    {
                        utilisateur.Password = nouveauMotDePasse;
                        MiseAJour(utilisateur);
                    }
                }
            }
            catch (ArgumentNullException ex)
            {
                throw new Exception("Erreur Metier : Echec Changement de mot de passe : un parametre est null", ex);
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        public Utilisateur Chercher(string email)
        {
            try
            {
                using (Context db = new Context())
                {
                    return (from u in db.Utilisateurs
                            where u.Email.Contains(email)
                            select u).FirstOrDefault();
                }
            }
            catch (ArgumentNullException ex)
            {
                throw new Exception("Erreur Metier : Echec Recuperation Utilisateur : email est null", ex);
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        public List<Utilisateur> Lister(TypeUtilisateur type)
        {
            try
            {
                using (Context db = new Context())
                {
                    switch (type)
                    {
                        case TypeUtilisateur.Device:
                            return (from u in db.Utilisateurs
                                    where u.IsDevice == true
                                    select u).ToList();

                        case TypeUtilisateur.Personne:
                            return (from u in db.Utilisateurs
                                    where u.IsDevice == false
                                    select u).ToList();

                        case TypeUtilisateur.Tous:
                            return (from u in db.Utilisateurs
                                    select u).ToList();
                        default:
                            return null;
                    }
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        public List<Utilisateur> Lister(TypeUtilisateur type, string nomRestaurant)
        {
            try
            {
                using (Context db = new Context())
                {
                    switch (type)
                    {
                        case TypeUtilisateur.Device:
                            return (from u in db.Utilisateurs
                                    where u.IsDevice == true && u.Lieu.Nom == nomRestaurant
                                    select u).ToList();

                        case TypeUtilisateur.Personne:
                            return (from u in db.Utilisateurs
                                    where u.IsDevice == false && u.Lieu.Nom == nomRestaurant
                                    select u).ToList();

                        case TypeUtilisateur.Tous:
                            return (from u in db.Utilisateurs
                                    where u.Lieu.Nom == nomRestaurant
                                    select u).ToList();
                        default:
                            return null;
                    }
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        public void VerouillerUtilisateur(Utilisateur utilisateur)
        {
            try
            {
                VerouillageUtilisateur(true, utilisateur);
            }
            catch (Exception ex)
            {
                throw new Exception("Erreur Metier : Echec Verouillage Utilisateur", ex);
            }
        }

        public void DeverouillerUtilisateur(Utilisateur utilisateur)
        {
            try
            {
                VerouillageUtilisateur(false, utilisateur);
            }
            catch (Exception ex)
            {
                throw new Exception("Erreur Metier : Echec Verouillage Utilisateur", ex);
            }
        }

        public void Supprimer(Utilisateur utilisateur, bool envoyerMessage)
        {
            try
            {
                using (Context db = new Context())
                {
                    db.Utilisateurs.Remove(utilisateur);
                    db.SaveChanges();
                }

                if (envoyerMessage)
                {
                    Mail mail = new Mail();

                    mail.Destinataire = utilisateur.Email;

                    mail.Titre = "Suppression de compte sur YouFood WebApp";

                    StringBuilder str = new StringBuilder("Bonjour, <br />");
                    str.Append("Votre compte sur la WebApplication YouFood vient d'etre supprimé.<br />");
                    str.Append("Si vous souhaitez contester cette decision, veuillez prendre rendez avec votre manager.<br />");
                    str.Append("Bonne journée à vous<br />");
                    str.Append("You Food WebApp");

                    mail.envoyer();
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        public void UtilisateurEnLigne(bool enLigne, Utilisateur utilisateur)
        {
            utilisateur.isOnline = enLigne;

            MiseAJour(utilisateur);
        }
    }
}
